package xgame;


/**
 * 抽象处理器
 * 
 * @author AfritXia
 * @param <T>
 * @version $Rev: 15 $
 * 
 */
public abstract class AbstractXhandler<T extends AbstractXcommand> {
	/**
	 * 命令对象
	 * 
	 */
	private T _command = null;

	/**
	 * 会话
	 * 
	 */
	private IXsession _session = null;

	/**
	 * 输出对象
	 * 
	 */
	private IXoutput _output = null;

	/**
	 * 类默认构造器
	 * 
	 */
	public AbstractXhandler() {
	}

	/**
	 * 获取命令对象
	 * 
	 * @return 
	 * 
	 */
	public T getCommand() {
		return this._command;
	}

	/**
	 * 获取抽象命令对象
	 * 
	 * @return 
	 * 
	 */
	private AbstractXcommand getAbstractCommand() {
		return this._command;
	}

	/**
	 * 设置抽象命令对象
	 * 
	 * @param value 
	 * 
	 */
	@SuppressWarnings("unchecked")
	private void setAbstractCommand(AbstractXcommand value) {
		this._command = (T)value;
	}

	/**
	 * 获取会话对象
	 * 
	 * @return 
	 * 
	 */
	public IXsession getSession() {
		return this._session;
	}

	/**
	 * 设置会话
	 * 
	 * @param value 
	 * 
	 */
	private void setSession(IXsession value) {
		this._session = value;
	}

	/**
	 * 获取输出对象
	 * 
	 * @return 
	 * 
	 */
	public IXoutput getOutput() {
		return this._output;
	}

	/**
	 * 设置输出对象
	 * 
	 * @param value 
	 * 
	 */
	private void setOutput(IXoutput value) {
		this._output = value;
	}

	/**
	 * 处理命令
	 * 
	 */
	public abstract void handle();

	/**
	 * 友元类
	 * 
	 * @author AfritXia
	 * @version $Rev: 15 $
	 *
	 */
	public static class Friend {
		/**
		 * 获取命令对象
		 * 
		 * @param cmdHandler 
		 * @return 
		 * 
		 */
		protected AbstractXcommand getAbstractCommand(
			AbstractXhandler<? extends AbstractXcommand> cmdHandler) {
			if (cmdHandler == null) {
				return null;
			}

			return cmdHandler.getAbstractCommand();
		}

		/**
		 * 设置命令对象 
		 * 
		 * @param cmdHandler 
		 * @param value 
		 * 
		 */
		protected void setAbstractCommand(
			AbstractXhandler<? extends AbstractXcommand> cmdHandler, 
			AbstractXcommand value) {
			if (cmdHandler == null) {
				return;
			}

			cmdHandler.setAbstractCommand(value);
		}

		/**
		 * 获取会话对象
		 * 
		 * @param cmdHandler 
		 * @return 
		 * 
		 */
		protected IXsession getSession(
			AbstractXhandler<? extends AbstractXcommand> cmdHandler) {
			if (cmdHandler == null) {
				return null;
			}

			return cmdHandler.getSession();
		}

		/**
		 * 设置会话
		 * 
		 * @param cmdHandler 
		 * @param value 
		 * 
		 */
		protected void setSession(
			AbstractXhandler<? extends AbstractXcommand> cmdHandler, 
			IXsession value) {
			if (cmdHandler == null) {
				return;
			}

			cmdHandler.setSession(value);
		}

		/**
		 * 获取输出对象
		 * 
		 * @param cmdHandler
		 * @return 
		 * 
		 */
		protected IXoutput getOutput(
			AbstractXhandler<? extends AbstractXcommand> cmdHandler) {
			if (cmdHandler == null) {
				return null;
			}

			return cmdHandler.getOutput();
		}

		/**
		 * 设置输出对象
		 * 
		 * @param cmdHandler
		 * @param value
		 * 
		 */
		protected void setOutput(
			AbstractXhandler<? extends AbstractXcommand> cmdHandler, 
			IXoutput value) {
			if (cmdHandler == null) {
				return;
			}

			cmdHandler.setOutput(value);
		}
	}
}
